package com.song.boot.springstudy.sort.linked;

import com.song.boot.springstudy.sort.linked.ListNode;

/**
 * 功能描述： LinkedList 单项链表反向输出（链表反转）
 * https://developer.aliyun.com/article/1546833
 * @author Songxianyang
 * @date 2025-09-07 15:23
 */
public class LinkedMain {
    // 链表反转核心方法
    public ListNode reverseList(ListNode head) {
        ListNode prev = null; // 前驱节点，初始为null（反转后链表的尾节点）
        ListNode curr = head; // 当前节点，从表头开始
        ListNode nextTemp; // 临时存储下一个节点

        while (curr != null) {
            nextTemp = curr.next; // 保存当前节点的下一个节点（防止断链）
            curr.next = prev;     // 反转当前节点的指向（指向前驱节点）
            prev = curr;          // 前驱节点向后移动（指向当前节点）
            curr = nextTemp;      // 当前节点向后移动（指向之前保存的下一个节点）
        }
        return prev; // 循环结束后，prev即为反转后的链表头
    }

    // 辅助方法：打印链表（用于验证结果）
    public void printList(ListNode head) {
        ListNode curr = head;
        while (curr != null) {
            System.out.print(curr.value + " ");
            curr = curr.next;
        }
        System.out.println(); // 换行
    }

    // 示例：创建链表并测试反转功能
    public static void main(String[] args) {
        LinkedMain linkedMain = new LinkedMain();

        // 1. 创建原始链表：1 -> 2 -> 3 -> 4 -> 5
        ListNode node5 = new ListNode(5);
        ListNode node4 = new ListNode(4, node5);
        ListNode node3 = new ListNode(3, node4);
        ListNode node2 = new ListNode(2, node3);
        ListNode head = new ListNode(1, node2);

        // 2. 打印原始链表
        System.out.println("原始链表：");
        linkedMain.printList(head);

        // 3. 执行链表反转
        ListNode reversedHead = linkedMain.reverseList(head);

        // 4. 打印反转后的链表
        System.out.println("反转后的链表：");
        linkedMain.printList(reversedHead);
    }
}
